package status

import "net/http"

// 1xx - 信息响应（告知客户端请求已接收，继续处理）
const (
	Continue           = http.StatusContinue           // 100：继续。客户端应继续其请求，服务器已接收请求的初步部分。
	SwitchingProtocols = http.StatusSwitchingProtocols // 101：切换协议。服务器同意客户端要求切换协议。
	Processing         = http.StatusProcessing         // 102：WebDAV；请求将继续处理，服务器已接收请求但尚未完成处理。
	EarlyHints         = http.StatusEarlyHints         // 103：用于提前提示前端加载资源，客户端应开始处理但不等待完全响应。
)

// 2xx - 成功响应（请求成功，服务器已成功处理请求）
const (
	OK                   = http.StatusOK                   // 200：请求成功，服务器已成功处理请求。
	Created              = http.StatusCreated              // 201：资源已成功创建，通常用于 POST 请求。
	Accepted             = http.StatusAccepted             // 202：请求已接受，尚未处理完成，通常用于异步处理的情况。
	NonAuthoritativeInfo = http.StatusNonAuthoritativeInfo // 203：返回的信息可能来自第三方，客户端应自行验证该数据。
	NoContent            = http.StatusNoContent            // 204：请求成功，无内容返回，通常用于删除操作。
	ResetContent         = http.StatusResetContent         // 205：请求成功，重置内容，表示客户端应重置视图。
	PartialContent       = http.StatusPartialContent       // 206：成功返回部分内容，通常用于范围请求（Range）。
	MultiStatus          = http.StatusMultiStatus          // 207：WebDAV；多状态响应，通常用于批量操作。
	AlreadyReported      = http.StatusAlreadyReported      // 208：WebDAV；前一个响应已报告，避免重复处理。
	IMUsed               = http.StatusIMUsed               // 226：服务器已完成 GET 请求，并使用实例操作（例如，返回变更集合）。
)

// 3xx - 重定向响应（要求客户端采取进一步的操作来完成请求）
const (
	MultipleChoices   = http.StatusMultipleChoices   // 300：多种选择，客户端可以选择不同的响应处理方式。
	MovedPermanently  = http.StatusMovedPermanently  // 301：永久重定向，客户端应使用新的 URL 访问资源。
	Found             = http.StatusFound             // 302：临时重定向，客户端应继续使用原 URL，但短期内会改变。
	SeeOther          = http.StatusSeeOther          // 303：请求已被处理，客户端应使用 GET 方法访问新位置。
	NotModified       = http.StatusNotModified       // 304：资源未修改，客户端可以使用缓存版本的资源。
	UseProxy          = http.StatusUseProxy          // 305：必须通过代理访问，已弃用，不常见。
	TemporaryRedirect = http.StatusTemporaryRedirect // 307：临时重定向，客户端应使用原始方法进行请求。
	PermanentRedirect = http.StatusPermanentRedirect // 308：永久重定向，客户端应继续使用新 URL，并且保持原请求方法。
)

// 4xx - 客户端错误（请求错误，由客户端原因引起的请求失败）
const (
	BadRequest                   = http.StatusBadRequest                   // 400：错误请求，通常表示请求格式不正确。
	Unauthorized                 = http.StatusUnauthorized                 // 401：未授权，客户端未提供有效的身份验证信息。
	PaymentRequired              = http.StatusPaymentRequired              // 402：需要支付，当前未使用，保留状态。
	Forbidden                    = http.StatusForbidden                    // 403：禁止访问，服务器理解请求但拒绝执行。
	NotFound                     = http.StatusNotFound                     // 404：资源未找到，客户端请求的资源不存在。
	MethodNotAllowed             = http.StatusMethodNotAllowed             // 405：请求方法不被允许，客户端请求的 HTTP 方法不被该资源支持。
	NotAcceptable                = http.StatusNotAcceptable                // 406：不可接受，客户端请求的内容类型无法被服务器处理。
	ProxyAuthRequired            = http.StatusProxyAuthRequired            // 407：需要代理身份认证，客户端需要通过代理验证。
	RequestTimeout               = http.StatusRequestTimeout               // 408：请求超时，服务器未及时收到客户端的请求。
	Conflict                     = http.StatusConflict                     // 409：资源冲突，通常指请求的数据与服务器中的现有数据冲突。
	Gone                         = http.StatusGone                         // 410：资源已永久删除，客户端请求的资源不再存在。
	LengthRequired               = http.StatusLengthRequired               // 411：缺少 Content-Length，服务器需要请求中包含有效的长度信息。
	PreconditionFailed           = http.StatusPreconditionFailed           // 412：前提条件失败，通常用于条件请求。
	RequestEntityTooLarge        = http.StatusRequestEntityTooLarge        // 413：请求体过大，服务器无法处理。
	RequestURITooLong            = http.StatusRequestURITooLong            // 414：请求 URI 太长，超过服务器允许的最大长度。
	UnsupportedMediaType         = http.StatusUnsupportedMediaType         // 415：不支持的媒体类型，客户端发送的格式无法处理。
	RequestedRangeNotSatisfiable = http.StatusRequestedRangeNotSatisfiable // 416：请求的范围无效，服务器无法满足客户端请求的部分数据。
	ExpectationFailed            = http.StatusExpectationFailed            // 417：Expectation 请求头无法满足，服务器不能满足客户端的 Expect 请求头。
	Teapot                       = http.StatusTeapot                       // 418：I'm a teapot，彩蛋，常用于轻松的场景或调试。
	MisdirectedRequest           = http.StatusMisdirectedRequest           // 421：请求被发送到错误的服务器。
	UnprocessableEntity          = http.StatusUnprocessableEntity          // 422：请求格式有效，但无法处理（如校验失败）。
	Locked                       = http.StatusLocked                       // 423：WebDAV；资源被锁定，通常用于并发访问控制。
	FailedDependency             = http.StatusFailedDependency             // 424：WebDAV；因依赖请求失败，通常用于多步骤操作。
	TooEarly                     = http.StatusTooEarly                     // 425：请求过早，客户端发送的请求太早。
	UpgradeRequired              = http.StatusUpgradeRequired              // 426：客户端需升级协议（例如，使用 HTTP/2 或 TLS）。
	PreconditionRequired         = http.StatusPreconditionRequired         // 428：请求需满足前提条件（例如，如果某个资源已存在，要求进行修改）。
	TooManyRequests              = http.StatusTooManyRequests              // 429：请求过多，客户端发送的请求频率过高，限流。
	RequestHeaderFieldsTooLarge  = http.StatusRequestHeaderFieldsTooLarge  // 431：请求头字段过大，客户端请求头包含的字段超过了服务器的最大允许值。
	UnavailableForLegalReasons   = http.StatusUnavailableForLegalReasons   // 451：因法律原因拒绝访问（如版权或地理限制）。
)

// 5xx - 服务端错误（服务器错误，通常是服务器未能完成合法请求）
const (
	InternalServerError           = http.StatusInternalServerError           // 500：服务器内部错误，服务器遇到未知错误。
	NotImplemented                = http.StatusNotImplemented                // 501：服务未实现，服务器不支持请求的功能。
	BadGateway                    = http.StatusBadGateway                    // 502：网关错误，通常是服务器作为网关或代理时，遇到上游服务器的问题。
	ServiceUnavailable            = http.StatusServiceUnavailable            // 503：服务不可用，服务器由于维护或负载过高暂时无法处理请求。
	GatewayTimeout                = http.StatusGatewayTimeout                // 504：网关超时，作为网关或代理的服务器未能及时收到响应。
	HTTPVersionNotSupported       = http.StatusHTTPVersionNotSupported       // 505：HTTP 版本不支持，服务器不支持客户端请求的 HTTP 版本。
	VariantAlsoNegotiates         = http.StatusVariantAlsoNegotiates         // 506：内容协商出错，服务器在多种版本内容协商时出错。
	InsufficientStorage           = http.StatusInsufficientStorage           // 507：WebDAV；服务器存储不足，无法完成请求。
	LoopDetected                  = http.StatusLoopDetected                  // 508：WebDAV；检测到循环请求，可能是客户端或服务器的配置错误。
	NotExtended                   = http.StatusNotExtended                   // 510：策略未满足，客户端请求未满足服务器要求的策略。
	NetworkAuthenticationRequired = http.StatusNetworkAuthenticationRequired // 511：需要网络认证，通常用于 WiFi 登录页等场景。
)

var StatusMsg = map[int]string{
	Continue:           "继续，客户端应继续其请求",
	SwitchingProtocols: "切换协议，服务器同意切换协议",
	Processing:         "WebDAV，请求将继续处理",
	EarlyHints:         "用于提前提示前端加载资源",

	OK:                   "请求成功",
	Created:              "资源已成功创建",
	Accepted:             "请求已接受，尚未处理完成",
	NonAuthoritativeInfo: "返回的信息可能来自第三方",
	NoContent:            "请求成功，无内容返回",
	ResetContent:         "请求成功，重置内容",
	PartialContent:       "成功返回部分内容（用于范围请求）",
	MultiStatus:          "WebDAV，多状态响应",
	AlreadyReported:      "WebDAV，前一个响应已报告",
	IMUsed:               "服务器已完成 GET 请求，并使用实例操作",

	MultipleChoices:   "多种选择",
	MovedPermanently:  "永久重定向",
	Found:             "临时重定向",
	SeeOther:          "请查看其他位置",
	NotModified:       "资源未修改，可使用缓存",
	UseProxy:          "必须通过代理访问（已弃用）",
	TemporaryRedirect: "临时重定向，方法不变",
	PermanentRedirect: "永久重定向，方法不变",

	BadRequest:                   "错误请求，参数问题",
	Unauthorized:                 "未授权或未登录",
	PaymentRequired:              "保留，当前未使用",
	Forbidden:                    "无权限访问",
	NotFound:                     "资源不存在",
	MethodNotAllowed:             "请求方法不被允许",
	NotAcceptable:                "不可接受的请求格式",
	ProxyAuthRequired:            "需要代理身份认证",
	RequestTimeout:               "请求超时",
	Conflict:                     "资源冲突，如重复提交",
	Gone:                         "资源已永久删除",
	LengthRequired:               "缺少 Content-Length",
	PreconditionFailed:           "前提条件失败",
	RequestEntityTooLarge:        "请求实体太大",
	RequestURITooLong:            "URI 太长",
	UnsupportedMediaType:         "不支持的媒体类型",
	RequestedRangeNotSatisfiable: "请求范围不符合要求",
	ExpectationFailed:            "Expect 请求头无法满足",
	Teapot:                       "I'm a teapot，彩蛋",
	MisdirectedRequest:           "请求被发送到错误服务器",
	UnprocessableEntity:          "语义错误，无法处理（校验失败等）",
	Locked:                       "WebDAV，资源被锁定",
	FailedDependency:             "WebDAV，因依赖请求失败",
	TooEarly:                     "过早发送",
	UpgradeRequired:              "客户端需升级协议",
	PreconditionRequired:         "需要前提条件",
	TooManyRequests:              "请求过多（限流）",
	RequestHeaderFieldsTooLarge:  "请求头字段过大",
	UnavailableForLegalReasons:   "因法律原因拒绝访问",

	InternalServerError:           "服务器内部错误",
	NotImplemented:                "服务未实现",
	BadGateway:                    "网关错误（通常是上游服务器错误）",
	ServiceUnavailable:            "服务不可用（维护/过载）",
	GatewayTimeout:                "网关超时",
	HTTPVersionNotSupported:       "HTTP 版本不支持",
	VariantAlsoNegotiates:         "内容协商出错",
	InsufficientStorage:           "WebDAV，服务器存储不足",
	LoopDetected:                  "WebDAV，检测到循环请求",
	NotExtended:                   "策略未满足",
	NetworkAuthenticationRequired: "需要网络认证（如 WiFi 登录页）",
}
